package model.data;

import java.util.Calendar;

/** 
 * @file Measurement.java  
 * 
 **/

/**
 * @class Measurement
 * @brief Reprezentacja pomiarów
 * 
 *        Obiekty klasy Measurement reprezentują pomiar, klasa jest
 *        przygotowana do reprezentacji danych pomiarowych z Wrocławia.
 * 
 * @param id
 *            Unikalny identyfikator pomiaru
 * @param time
 *            Czas pomiaru
 * @param intensity
 *            Natężenie ruchu
 * @param avgSpeed
 *            Średnia prędkość samochodów w danym okresie czasu (co 10 min).
 * @param temperature
 *            Temperatura powietrza podczas wykonywania pomiaru.
 * @param snow
 *            Ilość opadów śniegu.
 * @param rain
 *            Ilość opadów deszczu.
 * @param wind
 *            Siła wiatru.
 * @param carId
 *            Unikalny identyfikator samochodu, pomiar w przypadku Włocławka.
 */

public class Measurement {

	public static final int ID = 0;
	public static final int TIME = 1;

	private int id;
	private long time;
	private int weekDay;
	private int hour;
	private int minute;
	private double intensity;
	private double avgSpeed;
	private double temperature;
	private double humidity;
	private double snow;
	private double rain;
	private double wind;
	private int carId;

	private double[] values;

	public Measurement() {
		values = new double[19];
	}
	public Measurement(double [] values) {
		this.values = values;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
		values[0] = (double) id;
	}

	public long getTime() {
		return time;
	}

	
	/**
	 * @brief Metoda do ustawiania czasu.
	 * 
	 *        Jako argument przekazujemy czas Unixowy w milisekundach,
	 *        który następnie jest przeliczany na dzień tygodnia, miesiąc
	 *	   	  oraz godzine z minutami.        
	 */
	
	public void setTime(long time) {
		Calendar cal = Calendar.getInstance();
		cal.setTimeInMillis(time);
		values[1] = time;
		weekDay = cal.get(Calendar.DAY_OF_WEEK);
		values[2] = weekDay - 1;
		values[3] = cal.get(Calendar.MONTH);
		hour = cal.get(Calendar.HOUR_OF_DAY);
		minute = cal.get(Calendar.MINUTE);
		values[4] = minute + hour * 60;
		this.time = time;
	}

	public double getIntensity() {
		return intensity;
	}

	public void setIntensity(double intensity) {
		values[5] = intensity;
		this.intensity = intensity;
	}

	public double getAvgSpeed() {
		return avgSpeed;
	}

	public void setAvgSpeed(double avgSpeed) {
		values[6] = avgSpeed;
		this.avgSpeed = avgSpeed;
	}

	public double getTemperature() {
		return temperature;
	}

	public void setTemperature(double temperature) {
		this.temperature = temperature;
	}

	public double getSnow() {
		return snow;
	}

	public void setSnow(double snow) {
		this.snow = snow;
	}

	public double getRain() {
		return rain;
	}

	public void setRain(double rain) {
		this.rain = rain;
	}

	public double getWind() {
		return wind;
	}

	public void setWind(double wind) {
		this.wind = wind;
	}

	public int getCarId() {
		return carId;
	}

	public void setCarId(int carId) {
		this.carId = carId;
	}

	public int getWeekDay() {
		return weekDay;
	}

	public void setWeekDay(int weekDay) {
		this.weekDay = weekDay;
	}

	public double getHumidity() {
		return humidity;
	}

	public void setHumidity(double humidity) {
		this.humidity = humidity;
	}

	public int getHour() {
		return hour;
	}

	public void setHour(int hour) {
		this.hour = hour;
	}

	public int getMinute() {
		return minute;
	}

	public void setMinute(int minute) {
		this.minute = minute;
	}
	
	/**
	 * @brief Metoda do dodawania nowych danych.
	 * 
	 *        Jest to metoda pomocnicza, która służy do dodwania, aktualizacji danych
	 *        o wartości związane z pogodą.        
	 *
	 */

	public void addData(double[] data) {
		for (int i = 0; i < data.length; i++) {
			values[7 + i] = data[i];
		}

	}

	public double[] getValues() {
		return values;
	}

	public void setValues(double[] values) {
		this.values = values;
		setTime((long)values[1]);
		setIntensity(values[5]);
		setAvgSpeed(values[6]);
		setTemperature(values[7]);
		setHumidity(values[13]);
		setRain(values[14]);
		setWind(values[16]);
	}

	// public double[] toArray() {
	// double[] data = new double[7];
	// data[0] = (double) time;
	// data[1] = intensity;
	// data[2] = avgSpeed;
	// data[3] = temperature;
	// data[4] = humidity;
	// data[5] = rain;
	// data[6] = wind;
	//
	// return data;
	// }
}
